#pragma once
#include "TaskQueue.h"
#include "TaskQueue.cpp"
#include <iostream>
#include <string.h>
#include <string>
#include <unistd.h>

template <typename T>
class ThreadPool
{
public:
    /* 初始化线程池 */
    ThreadPool(int min, int max);
    /* 销毁线程池 */
    ~ThreadPool();
    /* 添加任务 */
    void addTask(Task<T> task);
    /* 获取线程池中工作线程的个数 */
    int getBusyNum();
    /* 获取线程池中活着的线程的个数 */
    int getAliveNum();
private:
    /* 工作线程的任务函数 */
    static void* worker(void* arg);
    /* 管理者线程任务函数 */
    static void* manager(void* arg);
    /* 单个线程退出 */
    void threadExit();

private:
    /* 任务队列 */
    TaskQueue<T>* taskQ;

    pthread_t managerID;
    pthread_t* threadIDs;

    int minNum;
    int maxNum;
    int busyNum;
    int liveNum;
    int exitNum;

    pthread_mutex_t mutexPool;
    pthread_cond_t notEmpty;
    static const int NUMBER = 2;

    bool shutdown;
};